home *** CD-ROM | disk | FTP | other *** search
Lisp/Scheme | 1988-04-07 | 2.7 KB | 95 lines | [TEXT/ttxt] |
- ;; Larry Mulcahy 1988
- ;; grind
-
- (provide 'grind)
- (require 'array)
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; grind
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defmacro grind (s) `(pprint (expr-to-make ',s)))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; expr-to-make
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun expr-to-make (symbol)
- (let
- ((result nil)
- )
- (if (symbol-plist symbol)
- (push (expr-to-make-plist symbol) result))
- (if (boundp symbol)
- (push (expr-to-set-value symbol) result))
- (if (fboundp symbol)
- (push (expr-to-make-function symbol) result))
- (if (> (length result) 1)
- `(progn ,@result)
- (car result))
- ))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; expr-to-make-function
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun expr-to-make-function (symbol)
- (let ((f (symbol-function symbol)))
- (if (not (equal (type-of f) 'subr))
- (let*
- ((l (get-lambda-expression f))
- (function-type (car l)) ; LAMBDA or MACRO
- (defining-word
- (case function-type
- (lambda 'defun)
- (macro 'defmacro)))
- (params (cadr l))
- (body (cddr l))
- )
- `(,defining-word ,symbol ,params ,@body)))))
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; expr-to-set-value
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun expr-to-set-value (symbol)
- (let
- ((v (symbol-value symbol))
- )
- `(setq ,symbol ,(expr-to-make-value v))
- ))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; expr-to-make-value
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun expr-to-make-value (v)
- (case (type-of v)
- (cons `(list ,@(mapcar #'expr-to-make-value v)))
- (symbol
- (if (symbol-plist v)
- (let ((plist-maker (expr-to-make-plist v)))
- `(progn ,plist-maker ',v))
- `',v))
- ((fixnum flonum string) v)
- (closure (get-lambda-expression v))
- (array `(vector ,@(mapcar #'expr-to-make-value (vector-to-list v))))
- ))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; expr-to-make-plist
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun expr-to-make-plist (symbol)
- (let*
- ((p (plist-names (symbol-plist symbol)))
- (putprop-exprs
- (mapcar
- #'(lambda (prop) `(putprop ',symbol ',(get symbol prop) ',prop))
- p)))
- (if (> (length putprop-exprs) 1)
- `(progn ,@putprop-exprs)
- (car putprop-exprs))))
-
-